home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / tools / netzwerk / parnet / sources / lock.asm < prev    next >
Assembly Source File  |  1996-02-26  |  3KB  |  124 lines

  1.  
  2.         ;   long var[2] = { 0, 0 };
  3.         ;
  4.         ;   These routines provide fast exclusive
  5.         ;   locks.
  6.         ;
  7.         ;   LockAddr(&var[0]:A0)
  8.         ;   UnlockAddr(&var[0]:A0)
  9.         ;   TryLockAddr(&var[0]:A0)
  10.  
  11.         section __MERGED,DATA
  12.  
  13.         xref    _SysBase
  14.  
  15.         section text,CODE
  16.  
  17.         include "exec/types.i"
  18.         include "exec/ports.i"
  19.         include "exec/tasks.i"
  20.         include "exec/execbase.i"
  21.         include "exec/ables.i"
  22.         include "exec/memory.i"
  23.  
  24.         xref    _LVOWait
  25.         xref    _LVOForbid
  26.         xref    _LVOPermit
  27.         xref    _LVOSignal
  28.  
  29.         xdef    @LockAddr
  30.         xdef    _LockAddr
  31.         xdef    @UnlockAddr
  32.         xdef    _UnlockAddr
  33.         xdef    @TryLockAddr
  34.         xdef    _TryLockAddr
  35.  
  36. _TryLockAddr:
  37.         move.l    4(sp),A0
  38. @TryLockAddr:
  39.         moveq.l #0,D0
  40.  
  41.         bset.b    D0,4(A0)                ; attempt to gain lock
  42.         bne    .tla10            ; failure
  43.         moveq.l #1,D0
  44.         rts                ; success, return 1
  45. .tla10        moveq.l #-1,D0            ; failure, return -1
  46.         rts
  47.  
  48. _LockAddr:                    ; bit: 0     lock: A0
  49.         move.l    4(sp),A0
  50. @LockAddr:                    ; bit: 0     lock: A0
  51.         moveq.l #0,D0
  52.  
  53.         bset.b    D0,4(A0)                ; attempt to gain lock
  54.         bne    .la10            ; failure
  55.         rts                ; success, done, rts (FAST)
  56.  
  57. .la10        movem.l A2/A6,-(sp)             ; failure (SLOW) (BLOCK)
  58.         move.l    _SysBase,A6        ; A6 = SYSBase
  59.         FORBID
  60.         bset.b    D0,4(A0)                ; try again after FORBID
  61.         beq    .la20            ; got it!
  62.  
  63.         ;   Put linked list structure on stack
  64.  
  65.         move.w    D0,-(sp)                ; bit#    12(sp)
  66.         move.l    ThisTask(A6),-(sp)      ; task#    8(sp)
  67.         move.l    A0,-(sp)                ; &var     4(sp)
  68.         move.l    (A0),-(sp)              ; Next      (sp)
  69.         move.l    sp,(A0)                 ; (put at head of list)
  70.  
  71.         ;   Loop Wait/re-attempt lock
  72.  
  73. .la15        moveq.l #$10,D0         ; wait (semaphore signal)
  74.         jsr    _LVOWait(A6)
  75.  
  76.         move.w    12(sp),D0               ; try for lock
  77.         move.l    4(sp),A0
  78.         bset.b    D0,4(A0)
  79.         bne    .la15            ; loop until get it
  80.  
  81. .la16        cmp.l    (A0),sp                 ; unlink, find our node!
  82.         beq    .la18
  83.         move.l    (A0),A0
  84.         bra    .la16
  85. .la18        move.l    (sp),(A0)
  86.         add.w    #14,sp
  87. .la20
  88.         PERMIT
  89.         movem.l (sp)+,A2/A6
  90.         rts
  91.  
  92. _UnlockAddr:    move.l    4(sp),A0
  93. @UnlockAddr:
  94.         moveq.l #0,D0
  95.  
  96.         bclr.b    D0,4(A0)                ; clear lock bit
  97.         move.l    (A0),D1                 ; anybody waiting?
  98.         beq    .ulrts            ; no, rts
  99.  
  100.         movem.l D2/A2/A6,-(sp)          ; yes, wake 'm all up
  101.         move.b    D0,D2            ; D2 = bit#
  102.         move.l    _SysBase,A6        ; A6 = SYSBase
  103.         FORBID
  104.  
  105.         move.l    (A0),D1                 ; get pointer again after FORBID
  106.         beq    .ul20            ; no, rts (close a window)
  107.  
  108. .ul10        move.l    D1,A2            ; A2 = node
  109.         cmp.b    13(A2),D2               ; waiting on our bit #?
  110.         bne    .ul18            ; no
  111.         move.l    8(A2),A1                ; yes, signal the node
  112.         moveq.l #$10,D0
  113.         jsr    _LVOSignal(A6)          ; signal EVERYONE waiting
  114. .ul18        move.l    (A2),D1                 ; next
  115.         bne    .ul10
  116.  
  117. .ul20
  118.         PERMIT
  119.         movem.l (sp)+,D2/A2/A6
  120. .ulrts        rts
  121.  
  122.  
  123.         END
  124.